﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Management;
using System.Printing;
using System.Threading;
using Microsoft.VisualBasic;
using System.IO;
using GIC.BO.Access;
using GIC.DAO.Model;
using GIC.UI.Helper;

namespace GIC.UI
{
    public partial class TelaPrincipal : Form
    {

        #region DeclararVariaveis
        private int Segundo = 1;
        private int segundoGrid = 1;
        private int indice = 0;
        private Parametros parametrosEntity = new Parametros();
        private static int TICKERTIMERSEC = 58;
        //private static int TICKERTIMERSEC = 15;

        private Chassi chassisEntity = new Chassi();
        private SocketThread socketThread;
        private Thread oThread;
        private Boolean stopTimer = false;

        private GICBo bo = new GICBo();

        private String senha;

        private List<Chassi> listarChassiImpresso = new List<Chassi>();
        private List<Chassi> listarChassiNaoImpresso = new List<Chassi>();

        #endregion

        #region Method


        public TelaPrincipal()
        {

            InitializeComponent();

            parametrosEntity = bo.obterParametro();

            if (socketThread == null)
            {

                if (parametrosEntity == null)
                {
                    parametrosEntity = new Parametros();
                    parametrosEntity.socketPorta = 9980;
                    parametrosEntity.socketIP = "127.0.0.1";
                    bo.salvar(parametrosEntity);
                }

                socketThread = new SocketThread(parametrosEntity.socketIP, parametrosEntity.socketPorta);

                //oThread = new Thread(() => socketThread.iniciarSocket());
                oThread = new Thread(() => socketThread.socketAtivo());

                oThread.Start();
            }
            this.TopMost = true;
            txtChassis.Focus();
        }



        private bool verificarStatusImpressora()
        {
            int statusImpressora = 0;

            int quantidadeVerificacoes = 0;
            do
            {
                if (quantidadeVerificacoes > 3)
                {
                    return true;
                }

                Thread.Sleep(5000);//5 segundos

                ConnectionOptions oConn = new ConnectionOptions();
                ManagementScope oMs = new System.Management.ManagementScope();

                String wmiq = "select * from Win32_Printer where Name ='" + this.parametrosEntity.nomeImpressora.Replace("\\", "\\\\") + "'";
                ObjectQuery oQuery = new System.Management.ObjectQuery(wmiq);
                ManagementObjectSearcher oSearcher = new ManagementObjectSearcher(oMs, oQuery);
                ManagementObjectCollection oReturnCollection = oSearcher.Get();
                foreach (ManagementObject oPrinter in oReturnCollection)
                {
                    statusImpressora = Convert.ToInt16(oPrinter["PrinterStatus"]);

                    if (statusImpressora == 3)
                    {
                        return true;//deu sucesso, nao preciso de todas as verificacoes
                    }
                }
                quantidadeVerificacoes++;
            } while (statusImpressora != 2 && statusImpressora != 1);//casos de erro

            MessageBox.Show("Impressora desligada e/ou sem papel!",
                                                "Impressoras",
                                                MessageBoxButtons.OK,
                                                MessageBoxIcon.Error,
                                                MessageBoxDefaultButton.Button1);

            return false;
        }

        private bool verificandoChave()
        {

            ArquivoHelper arquivo = new ArquivoHelper();
            String chave = null;

            chave = arquivo.recuperarChave();

            if (chave == null)
            {
                btnConfiguracoes.Enabled = false;
                btnStartStop.Enabled = false;
                btnImprimir.Enabled = false;
                txtChassis.Enabled = false;

                txtNotificacao.Enabled = true;
                txtNotificacao.Visible = true;
                btnNotificacao.Visible = true;

                txtNotificacao.Text = "Senha de Reinstalação em poder da VIN Brasil";

                return true;
            }

            if (arquivo.arquivandoChave(chave))
            {
                btnConfiguracoes.Enabled = false;
                btnStartStop.Enabled = false;
                btnImprimir.Enabled = false;
                txtChassis.Enabled = false;

                if (arquivo.getMessage() != null)
                {
                    txtNotificacao.Text = arquivo.getMessage();
                    txtNotificacao.Enabled = true;
                    txtNotificacao.Visible = true;
                    btnNotificacao.Visible = true;
                }

                return true;
            }

            if (arquivo.getMessage() != null)
            {
                txtNotificacao.Text = arquivo.getMessage();
                txtNotificacao.Enabled = true;
                txtNotificacao.Visible = true;
                btnNotificacao.Visible = true;
            }

            return false;

        }

        public void carregarGrid()
        {
            listarChassiImpresso = new List<Chassi>();
            listarChassiNaoImpresso = new List<Chassi>();

            listarChassiNaoImpresso = bo.listarChassiImpresso(false);
            listarChassiImpresso = bo.listarChassiImpresso(true);

            gvwResultado.Rows.Clear();
            string seqGrid = "";
            foreach (Chassi chassi in listarChassiNaoImpresso)
            {
                if (chassi.SEQ == 0)
                {
                    seqGrid = "";
                }
                else
                {
                    seqGrid = "" + chassi.SEQ;
                }

                gvwResultado.Rows.Insert(indice, false, seqGrid, chassi.bodyNumber, chassi.dataImpressao);
                indice++;
            }

            foreach (Chassi chassi in listarChassiImpresso)
            {
                if (chassi.SEQ == 0)
                {
                    seqGrid = "";
                }
                else
                {
                    seqGrid = "" + chassi.SEQ;
                }

                gvwResultado.Rows.Insert(indice, false, seqGrid, chassi.bodyNumber, chassi.dataImpressao);
                pintarLinha(indice);
                indice++;
            }


            indice = 0;
            gvwResultado.Refresh();
        }

        public void setParametrosEntity(Parametros novoParametroEntity)
        {
            if(stopTimer)
                this.cronometro.Stop();
            else
                this.cronometro.Start();
            if (novoParametroEntity != null)
                this.parametrosEntity = novoParametroEntity;
        }

        [DllImport("Winspool.drv")]
        private static extern bool SetDefaultPrinter(string printerName);

        public void pintarLinha(int indice)
        {
            Color corLinha;
            Color corTexto;

            corLinha = Color.Green;
            corTexto = Color.White;

            gvwResultado.Rows[indice].DefaultCellStyle.BackColor = corLinha;
            gvwResultado.Rows[indice].DefaultCellStyle.ForeColor = corTexto;
        }

        public void recarregarGrid()
        {
            listarChassiImpresso = new List<Chassi>();
            listarChassiNaoImpresso = new List<Chassi>();
            listarChassiNaoImpresso = bo.listarChassiImpresso(false);

            if (listarChassiNaoImpresso != null && this.parametrosEntity != null && listarChassiNaoImpresso.Count > 0)
            {
                this.cronometro.Stop();

                //enviar listarChassiNaoImpresso para impressao
                List<Chassi> chassis = new List<Chassi>();

                chassis.Add(listarChassiNaoImpresso[0]);
                bool resultado = imprimir(chassis);

                this.cronometro.Start();
            }
            listarChassiNaoImpresso = bo.listarChassiImpresso(false);
            listarChassiImpresso = bo.listarChassiImpresso(true);

            gvwResultado.Rows.Clear();

            String seqGrid = "";
            foreach (Chassi chassi in listarChassiNaoImpresso)
            {
                if (chassi.SEQ == 0)
                {
                    seqGrid = "";
                }
                else
                {
                    seqGrid = "" + chassi.SEQ;
                }
                gvwResultado.Rows.Insert(indice, false, chassi.SEQ, chassi.bodyNumber, chassi.dataImpressao);
                indice++;
            }

            foreach (Chassi chassi in listarChassiImpresso)
            {
                if (chassi.SEQ == 0)
                {
                    seqGrid = "";
                }
                else
                {
                    seqGrid = "" + chassi.SEQ;
                }
                gvwResultado.Rows.Insert(indice, false, chassi.SEQ, chassi.bodyNumber, chassi.dataImpressao);
                pintarLinha(indice);
                indice++;
            }



            indice = 0;
            gvwResultado.Refresh();

        }

        private void imprimirEtiquetaRolo(System.Drawing.Printing.PrintPageEventArgs e, float umCentimetro, float umMilimetro, Font f)
        {
            float inicioTextoLargura = 0;
            float inicioTextoAltura = 0;

            //valor unico, pois existem 2 for aninhados
            float indiceContinuo = 1;

            float alturaEtiquetaCM = (float)((float)this.parametrosEntity.alturaCM * umCentimetro);
            float larguraEtiquetaCM = (float)((float)this.parametrosEntity.larguraCM * umCentimetro);
            float espacamentoEntreEtiquetasCM = (float)((float)this.parametrosEntity.espacamentoCM * umCentimetro);


            for (int i = 1; i <= listarChassiNaoImpresso.Count; i++)
            {
                for (int j = 1; j <= this.parametrosEntity.qtdCopias; j++)
                {
                    float espacamento = 12;

                    int larguraAba = 45;
                    int alturaAba = 45;

                    String texto = "*" + listarChassiNaoImpresso[i - 1].bodyNumber + "*";

                    SizeF textSize = e.Graphics.MeasureString(texto, f);

                    inicioTextoLargura = ((float)(larguraEtiquetaCM / 2) - (float)((textSize.Width + listarChassiNaoImpresso[i - 1].bodyNumber.Length * espacamento) / 2) + (umMilimetro * 9.25f));

                    if (i == 1 && j == 1)
                    {
                        inicioTextoAltura = (float)(alturaEtiquetaCM / 2) - (float)(textSize.Height / 2) + umMilimetro;
                        //e.Graphics.DrawRectangle(Pens.Black, 0, 0, larguraEtiquetaCM, alturaEtiquetaCM);
                        Point p1 = new Point(0, 0);
                        Point p2 = new Point((int)larguraEtiquetaCM, 0);
                        Point p3 = new Point((int)larguraEtiquetaCM, (int)alturaEtiquetaCM);
                        Point p4 = new Point(0, (int)alturaEtiquetaCM);
                        Point p5 = new Point((int)larguraEtiquetaCM, (int)alturaEtiquetaCM - alturaAba);
                        Point p6 = new Point((int)larguraEtiquetaCM + larguraAba, (int)alturaEtiquetaCM - alturaAba / 2);


                        e.Graphics.DrawLine(Pens.Black, p1, p2);
                        e.Graphics.DrawLine(Pens.Black, p1, p4);
                        e.Graphics.DrawLine(Pens.Black, p4, p3);
                        e.Graphics.DrawLine(Pens.Black, p2, p5);

                        Rectangle rt = new Rectangle(p6.X - 68, p6.Y - 23, 45, 45);

                        e.Graphics.DrawArc(Pens.Black, rt, 0, -90);
                        e.Graphics.DrawArc(Pens.Black, rt, 0, 90);
                    }
                    else
                    {
                        float alturaAcumulada = ((alturaEtiquetaCM * (indiceContinuo - 1)) + (espacamentoEntreEtiquetasCM * (indiceContinuo - 1)));

                        Point p1 = new Point(0, (int)alturaAcumulada);
                        Point p2 = new Point((int)larguraEtiquetaCM, (int)alturaAcumulada);
                        Point p3 = new Point((int)larguraEtiquetaCM, (int)alturaEtiquetaCM + (int)alturaAcumulada);
                        Point p4 = new Point(0, (int)alturaEtiquetaCM + (int)alturaAcumulada);
                        Point p5 = new Point((int)larguraEtiquetaCM, (int)alturaEtiquetaCM + (int)alturaAcumulada - alturaAba);
                        Point p6 = new Point((int)larguraEtiquetaCM + larguraAba, (int)alturaEtiquetaCM + (int)alturaAcumulada - alturaAba / 2);

                        e.Graphics.DrawLine(Pens.Black, p1, p2);
                        e.Graphics.DrawLine(Pens.Black, p1, p4);
                        e.Graphics.DrawLine(Pens.Black, p4, p3);
                        e.Graphics.DrawLine(Pens.Black, p2, p5);

                        Rectangle rt = new Rectangle(p6.X - 68, p6.Y - 23, 45, 45);

                        e.Graphics.DrawArc(Pens.Black, rt, 0, -90);
                        e.Graphics.DrawArc(Pens.Black, rt, 0, 90);

                        //e.Graphics.DrawRectangle(Pens.Black, 0, alturaAcumulada, larguraEtiquetaCM, alturaEtiquetaCM);

                        inicioTextoAltura = (alturaAcumulada + (alturaEtiquetaCM / 2)) - (float)(textSize.Height / 2) + umMilimetro;
                    }

                    adicionarEspacamento(e, f, inicioTextoLargura, inicioTextoAltura, espacamento, texto);

                    indiceContinuo = indiceContinuo + 1;
                }
            }

            //para voltar carro da plotter
            e.Graphics.DrawRectangle(Pens.Black, 0, ((alturaEtiquetaCM * (indiceContinuo - 1)) + (espacamentoEntreEtiquetasCM * (indiceContinuo - 1))), 1, 1);
        }

        private static void adicionarEspacamento(System.Drawing.Printing.PrintPageEventArgs e, Font f, float inicioTextoLargura, float inicioTextoAltura, float espacamento, String texto)
        {
            float acumulado = 0;

            char[] array = texto.ToCharArray();

            for (int index = 0; index < array.Length; index++)
            {
                if (index == 0)
                {
                    e.Graphics.DrawString(array[0].ToString(), f, Brushes.Black, inicioTextoLargura, inicioTextoAltura, new StringFormat());
                }
                else if (index == 1)
                {
                    acumulado = acumulado + (inicioTextoLargura + (e.Graphics.MeasureString(array[index - 1].ToString(), f).Width - espacamento));

                    e.Graphics.DrawString(array[index].ToString(), f, Brushes.Black, acumulado, inicioTextoAltura, new StringFormat());
                }
                else
                {
                    acumulado = acumulado + ((e.Graphics.MeasureString(array[index - 1].ToString(), f).Width - espacamento));

                    e.Graphics.DrawString(array[index].ToString(), f, Brushes.Black, acumulado, inicioTextoAltura, new StringFormat());
                }
            }
        }

        private void imprimirEtiquetaSanfonada(System.Drawing.Printing.PrintPageEventArgs e, float umCentimetro, float umMilimetro, Font f)
        {
            float inicioTextoLargura = 0;
            float inicioTextoAltura = 0;

            //valor unico, pois existem 2 for aninhados
            float indiceContinuo = 1;

            float alturaEtiquetaCM = (float)((float)this.parametrosEntity.alturaCM * umCentimetro);
            float larguraEtiquetaCM = (float)((float)this.parametrosEntity.larguraCM * umCentimetro);
            float espacamentoEntreEtiquetasCM = (float)((float)this.parametrosEntity.espacamentoCM * umCentimetro);


            for (int i = 1; i <= listarChassiNaoImpresso.Count; i++)
            {
                for (int j = 1; j <= this.parametrosEntity.qtdCopias; j++)
                {
                    float espacamento = 12;

                    String texto = "*" + listarChassiNaoImpresso[i - 1].bodyNumber + "*";

                    SizeF textSize = e.Graphics.MeasureString(texto, f);

                    inicioTextoLargura = ((float)(larguraEtiquetaCM / 2) - (float)((textSize.Width + listarChassiNaoImpresso[i - 1].bodyNumber.Length * espacamento) / 2) + (umMilimetro * 13));

                    if (i == 1 && j == 1)
                    {
                        inicioTextoAltura = (float)(alturaEtiquetaCM / 2) - (float)(textSize.Height / 2) + +((float)(umMilimetro * 2));
                    }
                    else
                    {
                        float alturaAcumulada = ((alturaEtiquetaCM * (indiceContinuo - 1)) + (espacamentoEntreEtiquetasCM * (indiceContinuo - 1)));
                        inicioTextoAltura = (alturaAcumulada + (alturaEtiquetaCM / 2)) - (float)(textSize.Height / 2) + ((float)(umMilimetro * 2));
                    }

                    adicionarEspacamento(e, f, inicioTextoLargura, inicioTextoAltura, espacamento, texto);

                    indiceContinuo = indiceContinuo + 1;
                }
            }

            //para voltar carro da plotter
            e.Graphics.DrawRectangle(Pens.Black, 0, (((alturaEtiquetaCM * (indiceContinuo - 1)) + (espacamentoEntreEtiquetasCM * (indiceContinuo - 1)))) - ((float)(umMilimetro * 2.1)), 1, 1);
        }

        private void prepararImpressao(List<Chassi> chassis)
        {
            try
            {
                validarParametros();
            }
            catch { return; }

            this.parametrosEntity.qtdCopias = (this.parametrosEntity.qtdCopias > 0 ? this.parametrosEntity.qtdCopias : 1);

            //sucesso, imprimindo
            imprimir(chassis);

        }

        private void validarParametros()
        {
            //validar impressora
            if (this.parametrosEntity.nomeImpressora == null || this.parametrosEntity.nomeImpressora == "")
            {
                MessageBox.Show("Selecione a impresssora na tela de Configurações!",
                                        "Imprimir Chassi",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Error,
                                        MessageBoxDefaultButton.Button1);
                throw new Exception();
            }

            //validar impressora desligada e ou sem papel
            if (this.parametrosEntity.nomeImpressora == null || this.parametrosEntity.nomeImpressora == "")
            {
                //****************************************
                //***************************************
                // VER VER VER VER VERV VER VER
                //****************************************
                //***************************************

            }

            //validar altura, largura, espacamento
            if (this.parametrosEntity.larguraCM <= 0 || this.parametrosEntity.alturaCM <= 0 || this.parametrosEntity.espacamentoCM <= 0)
            {
                MessageBox.Show("Defina a largura e altura da etiqueta na tela de configurações!",
                                        "Imprimir Chassi",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Error,
                                        MessageBoxDefaultButton.Button1);
                throw new Exception();
            }


            //validar tipo etiqueta
            if (this.parametrosEntity.tipoEtiqueta == null || this.parametrosEntity.tipoEtiqueta == "")
            {
                MessageBox.Show("Defina o tipo da etiqueta na tela de configurações!",
                                        "Imprimir Chassi",
                                        MessageBoxButtons.OK,
                                        MessageBoxIcon.Error,
                                        MessageBoxDefaultButton.Button1);
                throw new Exception();
            }
        }

        private bool imprimir(List<Chassi> chassis)
        {
            btnImprimir.Enabled = false;
            btnConfiguracoes.Enabled = false;
            btnStartStop.Enabled = false;

            // Tamnho do papel
            imprimirDoc.DefaultPageSettings.PaperSize = new System.Drawing.Printing.PaperSize("PapelCustomizado", 1000000000, 1000000000);
            // Ajusta a margem. Sem margens, no exemplo.
            imprimirDoc.DefaultPageSettings.Margins.Left = 0;
            imprimirDoc.DefaultPageSettings.Margins.Right = 0;
            imprimirDoc.DefaultPageSettings.Margins.Top = 0;
            imprimirDoc.DefaultPageSettings.Margins.Bottom = 0;

            this.listarChassiNaoImpresso = chassis;

            // Paisagem 
            imprimirDoc.DefaultPageSettings.Landscape = true;

            SetDefaultPrinter(this.parametrosEntity.nomeImpressora);
            //imprimirDoc.PrinterSettings.PrinterName = this.parametrosEntity.nomeImpressora;

            imprimirDoc.Print();

            if (verificarStatusImpressora())
            {
                foreach (Chassi chassi in listarChassiNaoImpresso)
                {
                    chassi.impresso = 1;
                    chassi.dataImpressao = DateTime.Now;
                    this.bo.salvar(chassi);
                }

                btnImprimir.Enabled = true;
                btnConfiguracoes.Enabled = true;
                btnStartStop.Enabled = true;

                return true;
            }

            btnImprimir.Enabled = true;
            btnConfiguracoes.Enabled = true;
            btnStartStop.Enabled = true;

            return false;


        }

        #endregion

        #region ActionComponents

        private void botao_Click(object sender, EventArgs e)
        {
            Configuracoes form2;
            form2 = new Configuracoes(this, parametrosEntity, socketThread) { Owner = this};
            this.cronometro.Stop();
            this.Enabled = false;

            form2.Show();



        }

        public void Show()
        {
            this.txtChassis.Focus();
            base.Show();
            
        }

        private void button1_Click(object sender, EventArgs e)
        {

            this.cronometro.Stop();

            if (TelaPrincipal.InputBox("Digite a senha!", "Digite a senha!", ref this.senha) == DialogResult.OK)
            {
                if (this.senha != "")
                {
                    if (bo.obterSenha().Equals(this.senha))
                    {
                        if (this.txtChassis.Text.Trim() == "")
                        {
                            verificarEImprimirSelecionadosDoGrid();
                            this.timer1.Start();
                        }
                        else
                        {
                            this.imprimirChassi(this.txtChassis.Text.Trim());
                            this.txtChassis.Text = "";
                            this.carregarGrid();
                            if (stopTimer)
                                this.cronometro.Stop();
                            else
                                this.cronometro.Start();
                        }
                    }
                    else
                    {
                        MessageBox.Show("Senha Inválida!!", "...", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        this.timer1.Start();
                    }
                }
                else
                {
                    MessageBox.Show("Digite uma senha!", "...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                    this.timer1.Start();

                }
            }
            else
            {
                this.timer1.Start();
            }

            this.senha = "";
            this.txtChassis.Focus();


        }

        private void verificarEImprimirSelecionadosDoGrid()
        {
            int contadorDeRegistros = 0;
            foreach (DataGridViewRow row in this.gvwResultado.Rows)
            {
                string chassiGrid = Convert.ToString(row.Cells["Chassis"].Value);
                if (Convert.ToBoolean(row.Cells["selecionado"].Value) == true && chassiGrid.Trim() != "")
                {
                    contadorDeRegistros++;
                    imprimirChassi(chassiGrid);
                    row.Cells["selecionado"].Value = false;
                    pintarLinha(row.Index);
                    Chassi chassi = new Chassi();
                    chassi.bodyNumber = chassiGrid;
                    chassi = this.bo.obterChassi(chassi);
                    row.Cells["dataImpressao"].Value = chassi.dataImpressao;
                    return;
                }
            }

            if (contadorDeRegistros == 0)
            {
                this.timer1.Stop();
                if(!stopTimer)
                    this.cronometro.Start();
            }
        }

        private void imprimirChassi(String numeroChassi)
        {
            if (numeroChassi != null && numeroChassi != "")
            {
                Chassi chassi = new Chassi();
                chassi.bodyNumber = numeroChassi;
                chassi = this.bo.obterChassi(chassi);

                if (chassi == null)
                {
                    chassi = new Chassi();
                    chassi.bodyNumber = numeroChassi;
                    chassi.impresso = 0;
                    chassi.reportDate = DateTime.Now;
                    this.bo.salvar(chassi);
                    chassi = this.bo.obterChassi(chassi);
                }
                List<Chassi> chassis = new List<Chassi>();
                chassis.Add(chassi);
                prepararImpressao(chassis);
            }
        }

        private void cronometro_Tick(object sender, EventArgs e)
        {
            if (Segundo == TICKERTIMERSEC)
            {
                Segundo = 1;
                recarregarGrid();
                return;
            }
            Segundo++;
        }

        private void imprimirDoc_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            //1 centimetro
            float umCentimetro = (float)39.7;

            //1 milimetro
            float umMilimetro = (float)(39.7 / 10);

            float alturaFonte7mm = (float)30.70;

            //// Fonte para a impressão.
            Font fonte = new Font(this.parametrosEntity.nomeFonte, alturaFonte7mm);

            if (this.parametrosEntity.tipoEtiqueta.Equals("R"))
                imprimirEtiquetaRolo(e, umCentimetro, umMilimetro, fonte);
            else
                imprimirEtiquetaSanfonada(e, umCentimetro, umMilimetro, fonte);
        }

        public void txtNotificacao_KeyPress(object sender, KeyPressEventArgs e)
        {
            e.KeyChar = (char)0;
        }

        #endregion

        #region Main

        private void Form1_Load(object sender, EventArgs e)
        {
            cronometro.Stop();
            this.timer1.Stop();

            if (verificandoChave())
                return;

            cronometro.Start();

            try
            {
                this.bo.deletarChassiPorData(DateTime.Now);
                this.bo.deletarSocketPorData(DateTime.Now);
            }
            catch (Exception erro)
            {

                MessageBox.Show(erro.Message,
                                                    "",
                                                    MessageBoxButtons.OK,
                                                    MessageBoxIcon.Error,
                                                    MessageBoxDefaultButton.Button1);
            }

            listarChassiImpresso = new List<Chassi>();
            listarChassiNaoImpresso = new List<Chassi>();

            listarChassiNaoImpresso = bo.listarChassiImpresso(false);
            listarChassiImpresso = bo.listarChassiImpresso(true);

            gvwResultado.Rows.Clear();


            string seqGrid;
            foreach (Chassi chassi in listarChassiNaoImpresso)
            {
                if (chassi.SEQ == 0)
                {
                    seqGrid = "";
                }
                else
                {
                    seqGrid = "" + chassi.SEQ;
                }

                gvwResultado.Rows.Insert(indice, false, chassi.SEQ, chassi.bodyNumber, chassi.dataImpressao);
                indice++;
            }

            foreach (Chassi chassi in listarChassiImpresso)
            {
                if (chassi.SEQ == 0)
                {
                    seqGrid = "";
                }
                else
                {
                    seqGrid = "" + chassi.SEQ;
                }

                gvwResultado.Rows.Insert(indice, false, chassi.SEQ, chassi.bodyNumber, chassi.dataImpressao);
                pintarLinha(indice);
                indice++;
            }

            indice = 0;
            gvwResultado.Refresh();

        }

        #endregion

        private void btnNotificacao_Click(object sender, EventArgs e)
        {
            cronometro.Stop();
            ArquivoHelper arquivo = new ArquivoHelper();
            String sChave = sChave = Microsoft.VisualBasic.Interaction.InputBox("Chave", "Inserir Chave", "Digite aqui a Chave", (Screen.PrimaryScreen.Bounds.Width / 2) - 100, (Screen.PrimaryScreen.Bounds.Height / 2) - 100);

            arquivo.inserirChave(sChave);

            if (verificandoChave())
                return;

            btnConfiguracoes.Enabled = true;
            btnStartStop.Enabled = true;
            btnImprimir.Enabled = true;
            txtChassis.Enabled = true;

            txtNotificacao.Enabled = false;
            txtNotificacao.Visible = false;
            btnNotificacao.Visible = false;

            cronometro.Start();

            this.txtChassis.Focus();

        }

        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            if (oThread != null)
            {
                if (oThread.IsAlive)
                {
                    oThread.Suspend();
                }
            }

            Environment.Exit(0);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (segundoGrid == TICKERTIMERSEC)
            {
                segundoGrid = 1;
                verificarEImprimirSelecionadosDoGrid();
                return;
            }
            segundoGrid++;

        }

        private void btnStartStop_Click(object sender, EventArgs e)
        {
            if (this.btnStartStop.Text == "CONTINUAR")
            {
                this.stopTimer = false;
                this.cronometro.Start();
                this.btnStartStop.Text = "PARAR";
                this.txtNotificacao.Visible = false;
            }
            else
            {
                this.stopTimer = true;
                this.cronometro.Stop();
                this.btnStartStop.Text = "CONTINUAR";
                this.txtNotificacao.Text = "IMPRESSÃO INTERROMPIDA";
                this.txtNotificacao.Visible = true;
            }
        }
  

            public static DialogResult InputBox(string title, string promptText, ref string value)
        {
            Form form = new Form();
            Label label = new Label();
            TextBox textBox = new TextBox();
            Button buttonOk = new Button();
            Button buttonCancel = new Button();

            form.Text = title;
            label.Text = promptText;
            textBox.Text = value;

            buttonOk.Text = "OK";
            buttonCancel.Text = "Cancel";
            buttonOk.DialogResult = DialogResult.OK;
            buttonCancel.DialogResult = DialogResult.Cancel;

            label.SetBounds(9, 20, 372, 13);
            textBox.SetBounds(12, 36, 372, 20);
            textBox.PasswordChar = '*';
            buttonOk.SetBounds(228, 72, 75, 23);
            buttonCancel.SetBounds(309, 72, 75, 23);

            label.AutoSize = true;
            textBox.Anchor = textBox.Anchor | AnchorStyles.Right;
            buttonOk.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;
            buttonCancel.Anchor = AnchorStyles.Bottom | AnchorStyles.Right;

            form.ClientSize = new Size(396, 107);
            form.Controls.AddRange(new Control[] { label, textBox, buttonOk, buttonCancel });
            form.ClientSize = new Size(Math.Max(300, label.Right + 10), form.ClientSize.Height);
            form.FormBorderStyle = FormBorderStyle.FixedDialog;
            form.StartPosition = FormStartPosition.CenterScreen;
            form.MinimizeBox = false;
            form.MaximizeBox = false;
            form.AcceptButton = buttonOk;
            form.CancelButton = buttonCancel;
            form.TopMost = true;

            DialogResult dialogResult = form.ShowDialog();
            value = textBox.Text;
            return dialogResult;
        }

            private void txtChassis_TextChanged(object sender, EventArgs e)
            {
                if (txtChassis.Text != null && txtChassis.Text != "" && txtChassis.Text.Length == 10)
                {
                    try
                    {
                        this.cronometro.Stop();
                    }
                    catch (Exception Ex)
                    {
                    }

                   string letras = txtChassis.Text.Substring(0,3);

                   EtiquetaChassiLeitor et = bo.recuperarEtiquetaChassiLeitorExistentePeloCodigoEtiqueta(letras);

                   if (et == null)
                   {
                       MessageBox.Show("Cadastre o código correspondente á " +letras+ " para que possa ser impresso!", "...", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                   }
                   else
                   {

                       string numeros = txtChassis.Text.Substring(3, 7);

                       this.imprimirChassi(et.CodigoChassi.Trim().TrimEnd().TrimStart() + numeros.Trim().TrimEnd().TrimStart());


                       carregarGrid();
                   }


                   txtChassis.Text = "";
                   txtChassis.Focus();

                   txtChassis.Focus();
                }

                //this.cronometro.Start();

            }
    }

}
